package cn.wubo.dynamic.schedule.service;

import cn.wubo.dynamic.schedule.entity.TaskRecord;
import cn.wubo.dynamic.schedule.exception.BusinessRuntimeException;
import cn.wubo.loader.util.MethodUtils;
import groovy.lang.GroovyClassLoader;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;

@Slf4j
public class RunGroovyCode implements Runnable {
    private final TaskRecord taskRecord;

    public RunGroovyCode(TaskRecord taskRecord) {
        this.taskRecord = taskRecord;
    }

    /**
     * 执行任务的运行方法。
     * 该方法主要用于解析Groovy脚本，实例化脚本类，并执行指定的方法。
     * 使用GroovyClassLoader来加载动态生成的Groovy类，通过反射调用指定方法执行任务。
     * 在方法执行过程中，捕获任何异常，并记录执行结果。
     */
    @Override
    public void run() {
        // 记录任务开始执行的日志
        log.info("执行任务：" + taskRecord.getMemo() + "开始");
        try(GroovyClassLoader groovyClassLoader = new GroovyClassLoader()) {
            // 解析Groovy脚本类
            Class<?> clazz = groovyClassLoader.parseClass(taskRecord.getGroovyContext());
            // 调用脚本类的指定方法执行任务
            MethodUtils.invokeClass(clazz, taskRecord.getMethodName());
        } catch (Exception e) {
            // 记录任务执行失败的日志
            log.error("执行任务：" + taskRecord.getMemo() + "失败", e);
        }
        // 记录任务完成执行的日志
        log.info("执行任务：" + taskRecord.getMemo() + "完成");
    }


}
